﻿//目标:万能数据类型
//思路:记录类型名并浅复制数据区(void*指针保存数据区地址),并尽量提供安全的数据类型转换(普通数据类型用强转,类类型用拷贝构造函数或者是有参构造函数进行转换)
#ifndef C3POM_OBJECT
#define C3POM_OBJECT
#include<cstring>
#include<typeinfo>
#include<string>
#include<cstdlib>
#include<cstdio>
class Object
{
	private:
		std::string _typename;//保存类型名
		void* _data;//保存数据
		int _size;//数据长度
	public:
		Object();
		bool isnull();
		//有参构造函数
		template<typename T>
			Object(T t)
			{
				operator=(t);
			}
		//===========

		template<typename T>
			bool istype()//由给定的类型判断
			{
				return istype(typeid(T).name());
			}
		bool istype(std::string name);//由给定的类型名称
		//============

		//高级形式,判断是否为基本数据类型
		bool isbasictype();
		//=====

		//赋值
		template<typename T>
			void operator=(T t)//赋值.一层拷贝
			{
				_typename=typeid(T).name();//获取类型名称
				_size=sizeof(T);//数据的长度
				_data=malloc(_size);
				memcpy(_data,(void *)&t,_size);//保存数据
			}
		//特例化赋值
		void operator=(Object&);
		//=========

		template<class T>
			T castto()//该函数还需要斟酌
			{
				try
				{
					//不正确的转换会导致不可意料的错误,这里会采用日志的办法进行警告
					if(std::string(typeid(T).name())!=_typename)//判断二者类型是否一致
					{
						//	if(isbasictype())
						//		log(string("WARN:non-basictype casting may be cause serious problems"));//非基本类型的强制转换可能会导致严重的问题
						//	else
						printf("WARN:this type is '%s',but it will be casted to '%s'.\n",_typename.c_str(),typeid(T).name());
					}

					return *((T*)_data);
				}
				catch(...)
				{
				} 
			}
		std::string gettypename();
};
#endif
